#include "EventLoopThread.hpp"

EventLoopThread::EventLoopThread() : loop_(nullptr), exiting_(false) {
}

EventLoopThread::~EventLoopThread() {
    exiting_ = true;
    if (loop_ != nullptr) {
        loop_->stopLoop();// 通知停止事件循环
    }
    // 确保线程安全回收
    if (thread_.joinable()) {
        thread_.join();     // 无论loop_是否存在都尝试等待线程结束
    }
}

sp_EventLoop EventLoopThread::startLoop() {
    // 启动IO线程（创建新线程）
    thread_ = std::thread(&EventLoopThread::threadFunc, this);
    // 等待线程创建完成
    {
        std::unique_lock<std::mutex> lock(condMutex_);
        // 条件等待：直到子线程创建好EventLoop对象或收到停止信号
        cond_.wait(lock, [this]() { return loop_ != nullptr || exiting_; });
        if (exiting_) {
            throw std::runtime_error("Thread failed to start");
        }
    }
    return loop_;
}

sp_EventLoop EventLoopThread::getLoop() {
    return loop_;
}

//在子线程中创建EventLoop对象
void EventLoopThread::threadFunc() {
    if (exiting_) return;  // 在创建EventLoop前检查退出标志
    // 同步给主线程（通过条件变量）
    {
        std::lock_guard<std::mutex> lock(condMutex_);
        sp_EventLoop loop(new EventLoop());// 创建事件循环对象
        loop_ = loop;// 将新创建的EventLoop赋给主线程EventLoopThread的成员变量loop_
        cond_.notify_one();
    }
    loop_->startLoop();// 进入事件循环（阻塞在此处）
    // 事件循环结束后清理
    loop_.reset(); // 重置智能指针（引用计数减一）
}

void EventLoopThread::stop() {
    if (loop_ != nullptr) {
        loop_->stopLoop();// 通知停止事件循环
    }
}

void EventLoopThread::join() {
    if (thread_.joinable()) {
        thread_.join();     // 等待线程结束
    }
}